package com.pai4j.pgc.controller;

import com.pai4j.common.bean.PAIPageResponseBeanUtil;
import com.pai4j.common.bean.PAIResponseBean;
import com.pai4j.common.bean.PAIResponseBeanUtil;
import com.pai4j.domain.vo.request.subjectaccount.CreateSubjectRequest;
import com.pai4j.domain.vo.request.subjectaccount.UpdateSubjectRequest;
import com.pai4j.domain.vo.response.subjectaccount.ArticleBaseResponseVO;
import com.pai4j.domain.vo.response.subjectaccount.SubjectBaseResponseVO;
import com.pai4j.domain.vo.response.subjectaccount.SubjectStatisticsVO;
import com.pai4j.log.annotation.OperationLog;
import com.pai4j.pgc.service.ArticleStatisticsService;
import com.pai4j.pgc.service.SubjectArticleService;
import com.pai4j.pgc.service.SubjectService;
import com.pai4j.pgc.service.relation.SubjectRelationService;
import com.pai4j.remote.pgc.SubjectClient;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

/**
 * 专题
 *
 * @author: CYM-pai
 * @date: 2025/05/01 12:41
 **/

@Slf4j
@RestController
public class SubjectController implements SubjectClient {

    @Resource
    private SubjectService subjectService;
    @Resource
    private SubjectRelationService subjectRelationService;
    @Autowired
    private SubjectArticleService subjectArticleService;
    @Resource
    private ArticleStatisticsService articleStatisticsService;
    
    /**
     * 创建专题
     *
     * @author: CYM-pai
     * @date: 2025/05/01 15:23
     **/
    @Override
    @OperationLog(
        module = "专题管理",
        operation = "创建专题",
        description = "创建新的专题",
        recordParams = true
    )
    public PAIResponseBean<Boolean> create(@RequestBody CreateSubjectRequest subjectRequest) {
   
        return PAIResponseBeanUtil.success(subjectService.create(subjectRequest));
    }
    
    /**
     *  修改专题信息
     *
     * @author: CYM-pai
     * @date: 2025/05/07 15:46
     **/

    @Override
    @OperationLog(
        module = "专题管理",
        operation = "更新专题",
        description = "修改专题信息",
        recordParams = true
    )
    public PAIResponseBean<Boolean> update(@RequestBody UpdateSubjectRequest subjectRequest) {
        return PAIResponseBeanUtil.success(subjectService.update(subjectRequest));
    }
    
    /**
     * 按作者获取分页查询的专题列表
     *
     * @author: CYM-pai
     * @date: 2025/05/07 16:54
     **/
    @Override
    public PAIResponseBean<PAIPageResponseBeanUtil<List<SubjectBaseResponseVO>>> getSubjectList(Integer pageNo, Integer pageSize, String author) {
        return PAIResponseBeanUtil.success(subjectService.getSubjectList(pageNo, pageSize, author));
    }
    
    /**
     * 获取专题信息详情
     *
     * @author: CYM-pai
     * @date: 2025/05/08 15:19
     **/
    @Override
    public PAIResponseBean<SubjectBaseResponseVO> getSubjectBaseInfo(Long subjectAccount) {
        return PAIResponseBeanUtil.success(subjectService.getSubjectBaseInfo(subjectAccount));
    }
    
    /**
     *  获取当前登录用户创建的专题列表集合
     *
     *
     * @author: CYM-pai
     * @date: 2025/05/09 20:58
     **/
    @Override
    public PAIResponseBean<Map<Long,String>> getSubjectIdAndName(Long subjectId){
        return PAIResponseBeanUtil.success(subjectService.getSubjectIdAndName(subjectId));
    }
    
    @Override
    public PAIResponseBean<Map<Long,String>> getSubjectIdAndName(String userId){
        return PAIResponseBeanUtil.success(subjectService.getSubjectIdAndName(userId));
    }
    
    /**
     *  分页获取专题下的文章列表
     *
     * @author: CYM-pai
     * @date: 2025/05/16 18:32
     **/
    
    @Override
    public PAIResponseBean<PAIPageResponseBeanUtil<List<ArticleBaseResponseVO>>> getSubjectArticleList(Integer pageNo, Integer pageSize,Long subjectAccount) {
        return PAIResponseBeanUtil.success(subjectArticleService.getSubjectArticleList(pageNo, pageSize, subjectAccount));
    }
    
    
    /**
     * 订阅/关注
     *
     * @param userId : 用户id
     * @param subjectId : 被订阅/关注的专题id
     * @return
     */
    @Override
    public PAIResponseBean<Boolean> subscribe(@PathVariable String userId,
                                              @PathVariable Long subjectId) {
        
        return PAIResponseBeanUtil.success(subjectRelationService.subscribe(userId, subjectId));
    }
    
    /**
     * 取消订阅/关注
     *
     * @param userId : 用户id
     * @param subjectId : 被订阅/关注的专题id
     * @return
     */
    @Override
    public PAIResponseBean<Boolean> unsubscribe(@PathVariable String userId,
                                                @PathVariable Long subjectId) {
        
        return PAIResponseBeanUtil.success(subjectRelationService.unsubscribe(userId, subjectId));
    }
    
    
    /**
     *  获取订阅状态
     *
     * @author: CYM-pai
     * @date: 2025/07/06 00:37
     **/
    
    @Override
    public PAIResponseBean<Boolean> getSubscribeStatus(@PathVariable Integer relationType, @PathVariable String userId, @PathVariable Long subjectId) {
        return PAIResponseBeanUtil.success(subjectRelationService.isSubscribe(relationType, userId, subjectId));
    }
    
    /**
     * 获取专题推荐
     *
     * @param subjectId : 专题id
     * @return
     */
    @Override
    public PAIResponseBean<SubjectBaseResponseVO> getSubjectRecommand(Long subjectId) {
        return PAIResponseBeanUtil.success(subjectService.getSubjectRecommand(subjectId));
    }

    /**
     * 获取专题统计信息接口
     * 统计指定专题的订阅数、文章总数、已发布文章数等信息
     * 该接口使用Redis缓存以提高查询性能，缓存时间为1小时
     *
     * @param subjectId 专题ID，表示要查询统计信息的专题
     * @return 返回一个包含专题统计信息的API响应对象
     */
    @Override
    public PAIResponseBean<SubjectStatisticsVO> getSubjectStatistics(Long subjectId) {
        return PAIResponseBeanUtil.success(articleStatisticsService.getSubjectStatistics(subjectId));
    }
    
    /**
     * 删除专题接口（逻辑删除）
     * 删除指定专题，只有作者本人有权限删除
     * 采用逻辑删除，专题数据会保留在数据库中，便于数据分析和可能的恢复
     * 删除后会同时清除Redis缓存
     *
     * @param subjectId 专题ID
     * @param author 作者（用于权限验证）
     * @return 是否删除成功
     */
    @Override
    @OperationLog(
        module = "专题管理",
        operation = "删除专题",
        description = "用户逻辑删除专题",
        recordParams = true
    )
    public PAIResponseBean<Boolean> deleteSubject(Long subjectId, String author) {
        return PAIResponseBeanUtil.success(subjectService.deleteSubject(subjectId, author));
    }
    
    /**
     * 恢复已删除的专题接口（支持级联恢复）
     * 将逻辑删除的专题恢复为正常状态
     * 可选择是否同时恢复该专题下的已删除文章
     * 只有作者本人有权限恢复
     * 恢复后会重新加入缓存
     *
     * @param subjectId 专题ID
     * @param author 作者（用于权限验证）
     * @param cascadeRestore 是否级联恢复专题下的文章
     * @return 是否恢复成功
     */
    @Override
    @OperationLog(
        module = "专题管理",
        operation = "恢复专题（级联）",
        description = "用户恢复已删除的专题（可级联恢复文章）",
        recordParams = true
    )
    public PAIResponseBean<Boolean> restoreSubjectWithCascade(Long subjectId, String author, Boolean cascadeRestore) {
        return PAIResponseBeanUtil.success(subjectService.restoreSubject(subjectId, author, cascadeRestore));
    }
    
    /**
     * 恢复已删除的专题接口（兼容旧接口）
     * 将逻辑删除的专题恢复为正常状态
     * 默认不级联恢复文章
     * 只有作者本人有权限恢复
     * 恢复后会重新加入缓存
     *
     * @param subjectId 专题ID
     * @param author 作者（用于权限验证）
     * @return 是否恢复成功
     */
    @Override
    @OperationLog(
        module = "专题管理",
        operation = "恢复专题",
        description = "用户恢复已删除的专题",
        recordParams = true
    )
    public PAIResponseBean<Boolean> restoreSubject(Long subjectId, String author) {
        return PAIResponseBeanUtil.success(subjectService.restoreSubject(subjectId, author));
    }
    
    /**
     * 分页查询指定作者已删除的专题接口（回收站）
     * 查询用户已删除的专题列表，用于回收站功能
     * 只有作者本人可以查看自己删除的专题
     *
     * @param pageNo 页码
     * @param pageSize 每页大小
     * @param author 作者
     * @return 已删除专题分页列表
     */
    @Override
    public PAIResponseBean<PAIPageResponseBeanUtil<List<SubjectBaseResponseVO>>> pageDeletedByAuthor(
            Integer pageNo, Integer pageSize, String author) {
        return PAIResponseBeanUtil.success(subjectService.pageDeletedByAuthor(pageNo, pageSize, author));
    }
    
    /**
     * 统计指定作者的专题数量接口
     * 根据删除标识统计专题数量
     *
     * @param author 作者
     * @param deleteFlag 删除标识（1=未删除，0=已删除）
     * @return 专题数量
     */
    @Override
    public PAIResponseBean<Long> countSubjectsByAuthor(String author, Integer deleteFlag) {
        return PAIResponseBeanUtil.success(subjectService.countSubjectsByAuthor(author, deleteFlag));
    }
    
    /**
     * 物理删除专题接口（管理员专用，级联物理删除）
     * 直接从数据库中删除专题记录，无法恢复
     * 同时会物理删除该专题下的所有文章（级联物理删除）
     * 该操作需要管理员权限，请谨慎使用
     *
     * @param subjectId 专题ID
     * @param adminUser 管理员用户（用于审计记录）
     * @return 是否删除成功
     */
    @Override
    @OperationLog(
        module = "专题管理",
        operation = "物理删除专题（管理员）",
        description = "管理员物理删除专题并级联删除文章（危险操作）",
        recordParams = true
    )
    public PAIResponseBean<Boolean> physicalDeleteSubject(Long subjectId, String adminUser) {
        return PAIResponseBeanUtil.success(subjectService.physicalDeleteSubject(subjectId, adminUser));
    }
}
